using System;
using System.Windows.Forms;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using E4RPTools;
using ZecaFil.DataSet;

namespace ZecaFil.Controls
{
    public partial class UserXtraForm : XtraForm
    {
        private long _documentId;
        private Controller _controller;
        private UtilizadorDataSet _dataSet;

        #region Properties

        public long DocumentId
        {
            set { _documentId = value; }
        }

        public Controller Controller
        {
            set { _controller = value; }
        }

        #endregion

        public UserXtraForm()
        {
            InitializeComponent();
            Load += UserXtraFormLoad;
            OKSimpleButton.Click += OKSimpleButtonClick;
        }

        #region Private Methods

        private void MergeData()
        {
            _dataSet = new UtilizadorDataSet();
            if (_documentId <= 0)
            {
                var document = _dataSet.Utilizador.NewUtilizadorRow();
                document.Id = _documentId;
                document.Nome = "";
                document.Password = "";
                document.Perfil = (int)UserProfile.Operator;
                document.Zona = "";
                document.ExecutaIntervencao = false;
                document.ExecutaVenda = false;
                _dataSet.Utilizador.AddUtilizadorRow(document);
            }
            else
                _dataSet.Merge(_controller.GetUser(_documentId));
        }

        private void SetupProfileLookupData()
        {
            perfilUtilizadorDataSet = _controller.GetProfiles();
            profileLookUpEdit.Properties.Columns.Clear();
            profileLookUpEdit.Properties.Columns.AddRange(new[] {
                                                                    new LookUpColumnInfo("Id", "Id", 81, FormatType.None, "", false, HorzAlignment.Near),
                                                                    new LookUpColumnInfo("Nome", "Nome", 85, FormatType.None, "", true, HorzAlignment.Near)});
            profileLookUpEdit.Properties.DisplayMember = perfilUtilizadorDataSet.Perfil.NomeColumn.ColumnName;
            profileLookUpEdit.Properties.ValueMember = perfilUtilizadorDataSet.Perfil.IdColumn.ColumnName;
            profileLookUpEdit.Properties.DataSource = perfilUtilizadorDataSet.Perfil;
            profileLookUpEdit.Properties.BestFit();
        }

        private void SetupZoneLookupData()
        {
            zonaDataSet = _controller.GetZones();
            zoneLookUpEdit.Properties.Columns.Clear();
            zoneLookUpEdit.Properties.Columns.AddRange(new[] {
                    new LookUpColumnInfo("Nome", "Nome", 85, FormatType.None, "", true, HorzAlignment.Near)});
            zoneLookUpEdit.Properties.DisplayMember = zonaDataSet.Zona.NomeColumn.ColumnName;
            zoneLookUpEdit.Properties.ValueMember = zonaDataSet.Zona.NomeColumn.ColumnName;
            zoneLookUpEdit.Properties.DataSource = zonaDataSet.Zona;
        }

        private void SetDataToControls()
        {
            nameTextEdit.Text = _dataSet.Utilizador[0].Nome;
            passwordTextEdit.Text = _dataSet.Utilizador[0].Password;
            profileLookUpEdit.EditValue = _dataSet.Utilizador[0].Perfil;
            zoneLookUpEdit.EditValue = _dataSet.Utilizador[0].IsZonaNull() ? "" : _dataSet.Utilizador[0].Zona;
            runWorkOrderCheckEdit.Checked = _dataSet.Utilizador[0].ExecutaIntervencao;
            runSalesCheckEdit.Checked = _dataSet.Utilizador[0].ExecutaVenda;
        }

        private void GetDataFromControls()
        {
            _dataSet.Utilizador[0].Nome = nameTextEdit.Text;
            _dataSet.Utilizador[0].Password = passwordTextEdit.Text;
            _dataSet.Utilizador[0].Perfil = Convert.ToInt32(profileLookUpEdit.EditValue);
            if (zoneLookUpEdit.EditValue == Convert.DBNull || zoneLookUpEdit.EditValue.ToString() == "")
                _dataSet.Utilizador[0].SetZonaNull();
            else
                _dataSet.Utilizador[0].Zona = zoneLookUpEdit.EditValue.ToString();    
            _dataSet.Utilizador[0].ExecutaIntervencao = runWorkOrderCheckEdit.Checked;
            _dataSet.Utilizador[0].ExecutaVenda = runSalesCheckEdit.Checked;
        }

        private void ClearControlErrors()
        {
            dxErrorProvider.SetError(nameTextEdit, "");
            dxErrorProvider.SetError(passwordTextEdit, "");
            dxErrorProvider.SetError(profileLookUpEdit, "");
            dxErrorProvider.SetError(zoneLookUpEdit, "");
        }

        private Control GetControl(string reference)
        {
            switch (reference)
            {
                case "Nome":
                    return nameTextEdit;
                case "Password":
                    return passwordTextEdit;
                case "Perfil":
                    return profileLookUpEdit;
                case "Zona":
                    return zoneLookUpEdit;
                default:
                    return null;
            }
        }

        private void SetControlErrors(Result result)
        {
            foreach (var error in result.Errors)
                dxErrorProvider.SetError(GetControl(error.Reference), error.Message);
        }

        #endregion

        void UserXtraFormLoad(object sender, EventArgs e)
        {
            MergeData();
            SetupProfileLookupData();
            SetupZoneLookupData();
            SetDataToControls();
        }

        void OKSimpleButtonClick(object sender, EventArgs e)
        {
            ClearControlErrors();
            GetDataFromControls();
            var result = _controller.IsUserValid(_dataSet);
            if (result.Failed)
            {
                DialogResult = DialogResult.None;
                SetControlErrors(result);
            }
            else
                _controller.SaveUser(_dataSet);
        }
    }
}